package Gather.ArrayGatherExercise;

import java.util.ArrayList;

/**
 * ClassName:ArrayListDome001
 * Package:Gather.DataStructure
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/2/7-14:40
 * @Version:v1.0
 */
public class ArrayListDome001 {
    /*ArrayList集合底层原理
     * 1.利用空参创建的集合,在底层创一个默认长度为0的数组(elementData)
     * 2.添加一个元素时,底层创建一个新的长度为10的数组
     *   (size：1.元素的个数  2.下次存入位置)
     * 3.存满时,会扩容1.5倍
     * 4.如果一次添加多个元素,1.5倍还放不下.则新创建数组的长度以实际情况为准
     * */
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
    }

//    public boolean add(E e) {
//        modCount++;
//        //参数一：当前要添加的元素
//        //参数二：集合底层的数组名字
//        //参数三：集合的长度/当前元素应存入的位置
//        add(e, elementDate, size);
//        return true;
//    }
//
//    private void add(E e, Object[] elementDate, int s) {
//        if (s == elementData.length)
//              //grow表示数组扩容
//              elementData = grow();
//            elementDate[s]=e;
//            size = s + 1;
//
//    }
//
//    private Object[] grow() {
//        //把现有的个数 加 1
//        return grow(size + 1);
//    }
//
//    private Object[] grow(int minCapacity) {
//        int oldCapacity = elementData.length;//记录原来的老容量
//        if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
              //oldCapacity老容量
              //minCapacity - oldCapacity理论上我们至少要新增的容量
              //oldCapacity >> 1(右移)默认新增容量的大小
//            int newCapacity = ArraysSupport.newLength(oldCapacity, minCapacity - oldCapacity, oldCapacity >> 1);
//            //Arrays.copyOf方法
              //1.根据第二个参数创建新的数组
              //2.把第一个参数中的所有数据,全部拷贝到新的数组当中
//            return elementData = Arrays.copyOf(elementData, newCapacity);
//        } else {
    //第一次添加数据的时候,会执行到else这里
//            return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
//        }                                   //创建容量10的数组
//    }
//    //在集合中,不仅仅是一次添加一个元素,还可以依次添加很多元素
//    public static int newLength(int oldLength, int minGrowth, int prefGrowth) {
          //第一种情况：如果依次添加一个元素,那么第二个参数一定是1,表示此时数组只要扩容1各单位就可以了
          //第二种情况：如果一次添加多个元素,假设100,那么第二个参数是100,表示此时数组需要扩容100个单位才可以
//        int prefLength = oldLength + Math.max(minGrowth, prefGrowth);
//        if (0 < prefLength && prefLength <= SOFT_MAX_ARRAY_LENGTH) {
//            return prefLength;
//        } else {
//            return hugeLength(oldLength, minGrowth);
//        }
//    }
}
